package GoUtil

import "reflect"

// 实例化一个通过字符串映射函数切片的map
var eventByName = make(map[string][]*EventObj)

type EventObj struct {
	Callback func([]interface{})
	Obj      interface{}
}

func (o *EventObj) isEqual(tar *EventObj) bool {
	if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
		return true
	}
	return false
}

// 注册事件，提供事件名和回调函数
func RegisterEvent(name string, callback func([]interface{}), Obj interface{}) {

	eo := new(EventObj)
	eo.Callback = callback
	eo.Obj = Obj
	// 通过名字查找事件列表
	list := eventByName[name]

	// 在列表切片中添加函数
	list = append(list, eo)

	// 将修改的事件列表切片保存回去
	eventByName[name] = list
}

// 调用事件
func CallEvent(name string, param []interface{}) {

	// 通过名字找到事件列表
	list := eventByName[name]

	// 遍历这个事件的所有回调
	for _, eo := range list {
		// 传入参数调用回调
		eo.Callback(param)
	}
}

func RemoveEvent(name string, callback func([]interface{}), Obj interface{}) {
	// 通过名字找到事件列表
	list := eventByName[name]
	j := 0
	eo := new(EventObj)
	eo.Callback = callback
	eo.Obj = Obj
	// 遍历这个事件的所有回调
	for _, v := range list {
		if !v.isEqual(eo) {
			list[j] = v
			j++
		}
	}
	eventByName[name] = list[:j]
	// fmt.Println("len eventByName[name]:", len(eventByName[name]))
	//fmt.Println("len eventByName[name]:", len(eventByName))
	// fmt.Println("len list:", len(list))
}

func DeleteEleByValue(list []int, ele int) []int {
	j := 0
	for _, v := range list {
		if v != ele {
			list[j] = v
			j++
		}
	}
	ret := list[:j]
	return ret
}
